// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_AURA_TEST_EVENT_GENERATOR_DELEGATE_AURA_H_
#define UI_AURA_TEST_EVENT_GENERATOR_DELEGATE_AURA_H_

#include "base/macros.h"
#include "ui/events/test/event_generator.h"

namespace aura {
class Window;
class WindowTreeHost;

namespace client {
    class ScreenPositionClient;
}

namespace test {

    void InitializeAuraEventGeneratorDelegate();

    // Implementation of ui::test::EventGeneratorDelegate for Aura.
    class EventGeneratorDelegateAura : public ui::test::EventGeneratorDelegate {
    public:
        EventGeneratorDelegateAura();
        ~EventGeneratorDelegateAura() override;

        // Returns the host for given point.
        virtual WindowTreeHost* GetHostAt(const gfx::Point& point) const = 0;

        // Returns the screen position client that determines the
        // coordinates used in EventGenerator. EventGenerator uses
        // root Window's coordinate if this returns NULL.
        virtual client::ScreenPositionClient* GetScreenPositionClient(
            const aura::Window* window) const = 0;

        // Overridden from ui::test::EventGeneratorDelegate:
        ui::EventTarget* GetTargetAt(const gfx::Point& location) override;
        ui::EventSource* GetEventSource(ui::EventTarget* target) override;
        gfx::Point CenterOfTarget(const ui::EventTarget* target) const override;
        gfx::Point CenterOfWindow(gfx::NativeWindow window) const override;
        void ConvertPointFromTarget(const ui::EventTarget* target,
            gfx::Point* point) const override;
        void ConvertPointToTarget(const ui::EventTarget* target,
            gfx::Point* point) const override;
        void ConvertPointFromHost(const ui::EventTarget* hosted_target,
            gfx::Point* point) const override;
        void DispatchKeyEventToIME(ui::EventTarget* target,
            ui::KeyEvent* event) override;

    private:
        DISALLOW_COPY_AND_ASSIGN(EventGeneratorDelegateAura);
    };

} // namespace test
} // namespace aura

#endif // UI_AURA_TEST_EVENT_GENERATOR_DELEGATE_AURA_H_
